package main

import (
	"fmt"
	"reflect"
)

// 反射是指程序运行期间对程序本身进行访问和修改的能力
// 获取类型: reflect.TypeOf 静态的
// 获取值信息: reflect.ValueOf 动态的
func main() {
	// 反射获取结构体的属性和方法
	dog := &MyDog{
		Name: "傻狗",
		Age:  3,
	}

	dog.Say()
	t := reflect.TypeOf(*dog)
	v := reflect.ValueOf(*dog)
	for i := 0; i < t.NumField(); i++ {
		f := t.Field(i)
		fmt.Printf("字段名: %s, 字段类型: %v, 字段值: %v\n", f.Name, f.Type, v.Field(i))
	}

	for i := 0; i < t.NumMethod(); i++ {
		m := t.Method(i)
		fmt.Printf("方法: %s", m.Name)
	}

}

type MyDog struct {
	Name string
	Age  int
}

func (dog MyDog) Say() {
	fmt.Println("MyDog say:", dog.Name)
}
